package com.cdtu.controller;


import com.cdtu.dto.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;

/**
 * @author : Sakura
 * @Date : 2023/8/7 13:28
 * @Description : TODO 用来接收图片下载何保存本地的请求
 */
@RestController
@RequestMapping("/common")
//解决跨域问题
@CrossOrigin
public class ImageController {

    //这里的属性是你本地路径的磁盘地址
    @Value("${file.image}")
    private String basePath;

    /**
     * @param file: 前端上传的文件，用于保存在本地服务器的文件
     * @return R<String>
     * @author Sakura
     * @date 2023/10/26 10:37
     */
    @RequestMapping("/upload")
    public R<String> upload(MultipartFile file) {
        System.out.println(file);
        String Filename = UUID.randomUUID().toString();
        // file是一个临时文件，需要转存到指定位置，否则本次请求完成后会被删除。
        // 获取原来文件的名字。
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        Filename = Filename + suffix;
        // 判断文件夹是否存在,不存在就创建。
        File file1 = new File(basePath);
        if (!file1.exists()) {
            file1.mkdirs();
        }
        // 把临时文件转存到新的指定位置。
        try {
            file.transferTo(new File(basePath + Filename));
        } catch (IOException e) {
            e.printStackTrace();
        }
//        将保存好的文件名称拼接物理地址路径，然后将完整路径返回，让前端访问download方法回显图片
        return R.success(Filename);
    }

    /**
     * 前端页面请求下载图片给前端页面的回显
     *
     * @param name:文件名称
     * @param response:
     * @return void
     * @author Sakura
     * @date 2023/10/26 11:02
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
        //        System.out.println("下载"+name);
        try {
            //设置响应内容类型。
            response.setContentType("image/jpeg");
            // 创建文件输入流，读取服务器的文件。
            FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
//            System.out.println("文件名"+name);
            int len = 0;
            byte[] bytes = new byte[1024];
            // 获取文件输出流，以写数据到前端。
            ServletOutputStream outputStream = response.getOutputStream();
            // 循环读取
            while ((len = fileInputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, len);
                // 刷新
                outputStream.flush();
            }
            // 关闭资源
            fileInputStream.close();
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            //异常的正确处理模式应该是自定义异常，然后将抛出的异常返回给前端页面
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
